perm filename CHK[AP,SYS]3 blob
sn#013868 filedate 1972-11-21 generic text, type C, neo UTF8
COMMENT ⊗ VALID 00010 PAGES
C REC PAGE DESCRIPTION
C00001 00001
C00002 00002 Definitions.
C00003 00003 Storage allocations.
C00005 00004 Beginning of main program.
C00007 00005 Read in data files.
C00009 00006 Continue reading in the data files.
C00011 00007 Main loop.
C00013 00008 Final checks.
C00015 00009 Subroutines: MARK,PRINT.
C00016 00010 Subroutines: CKMLT,CKMLT2,CKLNKS.
C00018 ENDMK
C⊗;
;Definitions.
TITLE CHK
EXTERN DDT,$I,JOBREL,JOBFF,JOBSA
AC1←1
AC2←2
AC3←3
AC4←4
DICTWD←5
LAST←6
NEXT←7
CNT←10
ADR←11
QUO←12
REM←13
BPTR←14
MULT←15
MULT1←16
P←17
CR←←15 LF←←12
DEFINE ERRMSG(MSG,INS)
{JRST [OUTSTR [ASCIZ\
MSG
\]
JSR $I
INS ]}
DEFINE ERRXIT(MSG)
{JRST [OUTSTR [ASCIZ\
MSG
\]
CALLI 1,12]}
;Storage allocations.
PDLEN←←40
PDLIST: BLOCK PDLEN
DICT: XWD DICTWD,0
XWD DICTWD,0
XWD DICTWD,0
BACK: XWD MULT,0
LINKS: XWD NEXT,0
WORDS: XWD AC1,0
USETBL: XWD AC1,0
DSK17: 17
SIXBIT /DSK/
0
CMD: BLOCK 2
DICTF: SIXBIT /DICT/
BLOCK 3
LINKSF: SIXBIT /LINKS/
BLOCK 3
WORDSF: SIXBIT /WORDS/
BLOCK 3
ERRORF: SIXBIT /ERRORS/
BLOCK 3
DIGITS: BLOCK 5
SLINKS: 0 ;SIZE OF THE LINKS FILE
TBLSIZ: 0 ;SIZE OF USETBL
USEEND: 0
SAVEAC: 0
SDICT: 0 ;SIZE OF THE DICT FILE
MINMLT: 0 ;SMALLEST MULT PTR FOUND
MLTSTT: 0 ;RELATIVE LOCATION OF START OF MULT PART OF DICT
LOCMIN: 0 ;DICT ENTRY CORRESPONDING TO MINMLT
;Beginning of main program.
CHK: MOVE P,[IOWD PDLEN,PDLIST]
CALLI ;RESET
OUTSTR [ASCIZ/
/]
HRRZ AC2,JOBFF
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: RESET}
OPEN 17,DSK17
ERRXIT {OPEN FAILED ON DSK: ERRORS}
SETZM ERRORF+3
LOOKUP 17,ERRORF
OUTSTR [ASCIZ/NO /]
RELEAS 17,
OUTSTR [ASCIZ/ERRORS
/]
MOVE BPTR,[POINT 6,AC2]
OUTSTR [ASCIZ /EXTS? /]
MOVEI CNT,3
SETZ AC2,
NXCH: INCHRW AC1
CAIN AC1,CR
JRST PUTEXT
SOJL CNT,NXCH
TRZ AC1,40
TRZE AC1,100
TRO AC1,40
IDPB AC1,BPTR
JRST NXCH
PUTEXT: INCHRW AC1 ;READ THE LF AFTER THE CR
MOVEM AC2,DICTF+1
MOVEM AC2,LINKSF+1
MOVEM AC2,WORDSF+1
;Read in data files.
AGAIN1: OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: DICT}
SETZM DICTF+3
LOOKUP 1,DICTF
JRST [RELEAS 1,
OUTCHR ["-"]
MOVEI AC1,1
CALLI AC1,31 ;SLEEP
JRST AGAIN1]
OUTSTR [ASCIZ /+
/]
HLRE AC1,DICTF+3
TRNE AC1,177
ERRMSG {DICT DOES NOT END ON RECORD BOUNDARY},JRST .+1
MOVNM AC1,SDICT ;save size of DICT file
MOVE AC2,JOBREL
HRRZM AC2,CMD
HRLM AC1,CMD
ADDI AC2,1
HRRM AC2,DICT ;set up DICT indirect pointers
ADDI AC2,1
HRRM AC2,DICT+1
ADDI AC2,1
HRRM AC2,DICT+2
HRRM AC2,BACK
SUBI AC2,2 ;readjust AC2 to pt to first wd of DICT
SUB AC2,AC1
HRRM AC2,LINKS ;set up LINKS indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: DICT}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: DICT}
RELEAS 1,
OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: LINKS}
SETZM LINKSF+3
LOOKUP 1,LINKSF
ERRXIT {LOOKUP FAILED: LINKS}
HLRE AC1,LINKSF+3
MOVNM AC1,SLINKS ;save size of LINKS file
HRRZ AC2,LINKS
AOS LINKS ;correct LINKS indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,WORDS ;set up WORDS indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: LINKS}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: LINKS}
RELEAS 1,
;Continue reading in the data files.
OPEN 1,DSK17
ERRXIT {CANT OPEN THE DSK: WORDS}
SETZM WORDSF+3
LOOKUP 1,WORDSF
ERRXIT {LOOKUP FAILED: WORDS}
HLRE AC1,WORDSF+3
HRRZ AC2,WORDS
AOS WORDS ;correct WORDS indirect ptr
HRRZM AC2,CMD
HRLM AC1,CMD
SUB AC2,AC1
HRRM AC2,USETBL ;set up USETBL indirect ptr
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: WORDS}
IN 1,CMD
JRST .+2
ERRXIT {IN UUO FAILED: WORDS}
RELEAS 1,
HRRZ AC2,USETBL
AOS USETBL ;correct USETBL indirect ptr
MOVE AC1,SLINKS
TRNE AC1,77
ADDI AC2,100
ASH AC1,-6
MOVEM AC1,TBLSIZ
SOS TBLSIZ
ADD AC2,AC1
HRRZM AC2,USEEND
CALLI AC2,11 ;CORE
ERRXIT {CORE UUO FAILED: USETBL}
HRRZ AC1,USETBL
HRLZI AC2,740000
MOVEM AC2,(AC1)
HRL AC1,AC1
ADDI AC1,1
BLT AC1,@USEEND
HRRZ AC2,USEEND
HRRM AC2,JOBFF
;Main loop.
SETZM MLTSTT
MOVEI MULT,-1
MOVEM MULT,MINMLT
SETZM USED#
SETZ DICTWD,
NXTDWD: ADDI DICTWD,2
HLRZ AC1,@DICT
MOVE AC4,@WORDS
CAMN AC4,[77B6]
JRST MULTS
PUSHJ P,CKMLT
PUSHJ P,CKLNKS
JRST NXTDWD
MULTS: ADDI DICTWD,2
TRZE DICTWD,177
ADDI DICTWD,200
MOVEM DICTWD,MLTSTT
NXTMLT: PUSHJ P,CKMLT
HRRE MULT,@DICT+2
PUSHJ P,CKMLT2
PUSHJ P,CKLNKS
ADDI DICTWD,3
CHKREC: SKIPE @DICT
JRST NXTMLT
ADDI DICTWD,2
TRNN DICTWD,177
JRST CHKREC
;Final checks.
MOVE AC1,MINMLT
MOVE ADR,LOCMIN
CAMGE AC1,MLTSTT
ERRMSG {MULT PTR POINTS TO MAIN PART OF DICT, NOT MULT PART},JRST .+1
SETO CNT,
SETZ NEXT,
NXTFRE: ADDI CNT,1
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT AVAIL SLOT IS OUT OF RANGE},JRST AOOR
PUSHJ P,MARK
MOVE NEXT,@LINKS
TLZE NEXT,-1
ERRMSG {NON-ZERO LEFT HALF OF AVAIL SLOT},JRST .+1
JUMPN NEXT,NXTFRE
AOOR: MOVEM CNT,FREE#
;Calculate locations of unreachable slots.
SETZ AC1,
NXTWD: AOSN AC2,@USETBL
JRST GETWD
SUBI AC2,1
SETCA AC2,
SETZ CNT,
JRST BOT
TOP: ADDI CNT,1(AC3)
LSH AC2,1(AC3)
MOVE ADR,AC1
ASH ADR,6
ADDI ADR,=72
SUB ADR,CNT
SUB ADR,CNT
CAMGE ADR,SLINKS
ERRMSG {LOST SLOT (ADR)},JRST .+1
BOT: JFFO AC2,TOP
GETWD: CAMGE AC1,TBLSIZ
AOJA AC1,NXTWD
CALLI 0 ;RESET PAGE PRINTER
OUTSTR [ASCIZ /
/]
MOVE QUO,FREE
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS LEFT IN AVAIL LIST
/]
MOVE QUO,USED
PUSHJ P,PRINT
OUTSTR [ASCIZ / SLOTS TOTAL
/]
CALLI 1,12 ;EXIT
JRST CHK
;Subroutines: MARK,PRINT.
MARK: LDB AC1,[POINT 12,NEXT,29] ;get adr of marking word
LDB AC2,[POINT 5,NEXT,34] ;get shift amount
MOVEI AC3,1
LSH AC3,(AC2)
MOVE AC4,AC3
AND AC4,@USETBL
JUMPE AC4,MOK ;was this link already marked used
ERRMSG {SLOT IN TWO LISTS},{POPJ P,}
MOK: ORM AC3,@USETBL ;no. marOk it now
AOS USED
POPJ P,
PRINT: MOVE BPTR,[POINT 7,DIGITS]
PUSHJ P,NXTDG
SETZ AC1,
IDPB AC1,BPTR
OUTSTR DIGITS
POPJ P,
NXTDG: IDIVI QUO,=10
PUSH P,REM
SKIPE QUO
PUSHJ P,NXTDG
COLLEC: POP P,AC1
ADDI AC1,60
IDPB AC1,BPTR
POPJ P,
;Subroutines: CKMLT,CKMLT2,CKLNKS.
CKMLT: HLRE MULT,@DICT+1 ;check MULT ptr for consistency
CKMLT2: JUMPE MULT,CPOPJ
JUMPG MULT,.+2
ERRMSG {NEGATIVE MULT PTR},{POPJ P,}
CAML MULT,SDICT
ERRMSG {MULT PTR OUT OF RANGE},{POPJ P,}
CAMLE MULT,MINMLT
JRST CKMLT1
CAML MULT,MINMLT
ERRMSG {TWO MULT PTRS POINT TO SAME MULT ENTRY},{POPJ P,}
MOVEM MULT,MINMLT
MOVEM DICTWD,LOCMIN
CKMLT1:
HLRE MULT1,@BACK
CAME MULT1,DICTWD
ERRMSG {INCORRECT BACK MULT PTR},JRST .+1
TRZ MULT,-200
IDIVI MULT,3
JUMPE MULT+1,CPOPJ
ERRMSG {MULT PTR NOT MULTIPLE OF 3},{POPJ P,}
CPOPJ: POPJ P,
CKLNKS: HRRZ NEXT,@DICT+1 ;check story list in LINKS for this keyword
JUMPE NEXT,CPOPJ ;zero means no stories contain this keyword
CAIN NEXT,-1 ;-1 means this is not a legal keyword
POPJ P,
CAML NEXT,SLINKS
ERRMSG {PTR FROM DICT TO LINKS IS OUT OF RANGE},{POPJ P,}
MOVNM DICTWD,LAST
NXTLNK: HRRE AC2,@LINKS
CAME AC2,LAST
ERRMSG {INCORRECT BACK PTR FOR DOUBLY LINKED LIST IN LINKS},{POPJ P,}
PUSHJ P,MARK
MOVE LAST,NEXT
HLRZ NEXT,@LINKS
CAML NEXT,SLINKS
ERRMSG {PTR TO NEXT SLOT IS OUT OF RANGE (SINGLE)},{POPJ P,}
JUMPN NEXT,NXTLNK
POPJ P,
END CHK